﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Collections.Specialized;
using Gateway;
using System.Text;
using ZF.BLL.Page;
using ZF.BLL;
using GCELibrary.Current;
using ZF.Model;
namespace ZF.WS.space
{
    /// <summary>
    /// 创建该页面文件时，请留心该页面文件是可以对其进行美工处理的，原因在于支付完成以后，当前窗口会从支付宝的页面跳转回这个页面。
    /// 该页面称作“返回页”，是同步被支付宝服务器所调用，可当作是支付完成后的提示信息页，如“您的某某某订单，多少金额已支付成功”。
    /// </summary>
    public partial class Alipay_Return : PageBase
    {
        protected void Page_Load(object sender, EventArgs e)
        {

            bool success = false;
            var postData = "";
            foreach (var key in Request.QueryString.AllKeys)
            {
                postData += Request.QueryString[key] + "\r\n";
            }
            Model.US_IntegralOrder order=null;
            Model.US_Member member = null;
            if (CheckSign())   //验证支付发过来的消息，签名是否正确
            {
                 //更新自己数据库的订单语句，请自己填写一下
                string strOrderNO = Request.QueryString["out_trade_no"];//订单号
                using (var ts = new System.Transactions.TransactionScope())
                {
                    using (var dc = SiteInfo.CreateDBDataContext())
                    {
                          order = dc.US_IntegralOrder.FirstOrDefault(p => p.No == strOrderNO);
                          var flag = false;
                        if (order == null)
                        {
                            WarnFactory.CreateWarn(new PageWarnParameter()
                            {
                                JscriptMode = true,
                                Link = WarnLink.GoBack,
                                Message = "该订单不存在",
                            }).Alert();
                            return;
                        }

                        if (!(order.PayStatus == (int)PayStatus.TRADE_FINISHED || order.PayStatus == (int)PayStatus.TRADE_SUCCESS ))
                        {
                            order.PayStatus = (int)PayStatus.TRADE_FINISHED;//支付状态
                            order.PayTime = DateTime.Now;//支付时间
                            order.AlipayAccount = Request.QueryString["buyer_id"];
                            order.SerialNumber = Request.QueryString["trade_no"];
                            flag = true;
                        }
         
                        try
                        {
                            dc.SubmitChanges();
                            if (flag)
                            {
                                SiteInfo.IntegralLog(order.MemberId, "积分充值", -order.Quantity);
                            }
                              member = order.US_Member;
                            ts.Complete();

                            success = true;
                        }
                        catch (Exception ex)
                        {
                            SiteInfo.InsertLog(ex);
                        }
                    }
                }
                
                //string strPrice = Request.QueryString["total_fee"];//金额
                //string strTradeStatus = Request.QueryString["trade_status"];//订单状态
                //Response.Write("订单号：" + strOrderNO + "<br>金额：" + strPrice);     //成功，可美化该页面，提示信息
            }
 


            if (success)
            {
                string page = "/index.aspx";
                if (SiteInfo.GetCurrentMember() != null&& SiteInfo.GetCurrentMember() is BLL.GeneralMember)
                {
                    page = "/Person/space/balance.aspx";
                }


                WarnFactory.CreateWarn(new PageWarnParameter()
                {
                    JscriptMode = true,
                    Link = WarnLink.GoPage,
                    DoPage = page,
                    Message = string.Format("积分充值成功,您现在的积分为{0}",member.Integral),
                }).Alert();
                return;
            }
            else
            {
                WarnFactory.CreateWarn(new PageWarnParameter()
                {
                    JscriptMode = true,
                    Link = WarnLink.GoPage,
                    DoPage = "/index.aspx",
                    Message = "积分充值失败，如果您已经付款，并且您的支付宝帐户已经扣除相应金额请与我们联系。",
                }).Alert();
                return;
            }

        }



        private bool CheckSign()
        {
            var alipayset = SiteInfo.SystemConfig.AlipaySet;
            string alipayNotifyURL = "https://www.alipay.com/cooperate/gateway.do?service=notify_verify";
            //string alipayNotifyURL = "http://notify.alipay.com/trade/notify_query.do?";//此路径是在上面链接地址无法起作用时替换使用。
            string partner = alipayset.Partner; 		//partner合作伙伴id（必须填写）
            string key = alipayset.Key; //partner 的对应交易安全校验码（必须填写）
            string _input_charset = "utf-8";//编码类型，完全根据客户自身的项目的编码格式而定，千万不要填错。否则极其容易造成MD5加密错误。

            alipayNotifyURL = alipayNotifyURL + "&partner=" + partner + "&notify_id=" + Request.QueryString["notify_id"];

            //获取支付宝ATN返回结果，true是正确的订单信息，false 是无效的
            string responseTxt = AliPay.Get_Http(alipayNotifyURL, 120000);

            //*******加密签名程序开始//*******
            int i;
            NameValueCollection coll;
            //Load Form variables into NameValueCollection variable.
            coll = Request.QueryString;

            // Get names of all forms into a string array.
            String[] requestarr = coll.AllKeys;

            //进行排序；
            string[] Sortedstr = AliPay.BubbleSort(requestarr);

            //构造待md5摘要字符串 ；

            StringBuilder prestr = new StringBuilder();

            for (i = 0; i < Sortedstr.Length; i++)
            {
                if (Request.Form[Sortedstr[i]] != "" && Sortedstr[i] != "sign" && Sortedstr[i] != "sign_type")
                {
                    if (i == Sortedstr.Length - 1)
                    {
                        prestr.Append(Sortedstr[i] + "=" + Request.QueryString[Sortedstr[i]]);
                    }
                    else
                    {
                        prestr.Append(Sortedstr[i] + "=" + Request.QueryString[Sortedstr[i]] + "&");

                    }
                }
            }

            prestr.Append(key);

            //生成Md5摘要；
            string mysign = AliPay.GetMD5(prestr.ToString(), _input_charset);
            //*******加密签名程序结束*******

            string sign = Request.QueryString["sign"];

            //  Response.Write(prestr.ToString());  //调试用，支付宝服务器返回时的完整路径。
 
            //*******加密签名程序结束*******
            return mysign == sign && responseTxt == "true";

        }
    }
}
